From 75606909f1f2e49a3338928651b8cee1aaf0d597 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 2 Mar 2006 19:52:26 +0000 Subject: [PATCH] Make scroll_to_path work for newly inserted items, by delaying the scroll 2006-03-02 Matthias Clasen * gtk/gtkiconview.c (gtk_icon_view_layout) (gtk_icon_view_row_inserted, gtk_icon_view_scroll_to_path): Make scroll_to_path work for newly inserted items, by delaying the scroll until layout is done. (#332923, Cory Dodt) --- ChangeLog | 5 ++++ ChangeLog.pre-2-10 | 5 ++++ gtk/gtkiconview.c | 67 +++++++++++++++++++++++++++------------------- 3 files changed, 49 insertions(+), 28 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6fbdc8b912..5f61228faa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2006-03-02 Matthias Clasen + * gtk/gtkiconview.c (gtk_icon_view_layout) + (gtk_icon_view_row_inserted, gtk_icon_view_scroll_to_path): + Make scroll_to_path work for newly inserted items, by delaying + the scroll until layout is done. (#332923, Cory Dodt) + * gtk/gtkcolorbutton.c (render): Use GTK_WIDGET_IS_SENSITIVE, not GTK_WIDGET_SENSITIVE. (#333133, Christian Persch) diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 6fbdc8b912..5f61228faa 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,5 +1,10 @@ 2006-03-02 Matthias Clasen + * gtk/gtkiconview.c (gtk_icon_view_layout) + (gtk_icon_view_row_inserted, gtk_icon_view_scroll_to_path): + Make scroll_to_path work for newly inserted items, by delaying + the scroll until layout is done. (#332923, Cory Dodt) + * gtk/gtkcolorbutton.c (render): Use GTK_WIDGET_IS_SENSITIVE, not GTK_WIDGET_SENSITIVE. (#333133, Christian Persch) diff --git a/gtk/gtkiconview.c b/gtk/gtkiconview.c index 05bec7202b..5de9f61102 100644 --- a/gtk/gtkiconview.c +++ b/gtk/gtkiconview.c @@ -2477,6 +2477,12 @@ gtk_icon_view_layout (GtkIconView *icon_view) gint row; gint item_width; + if (icon_view->priv->layout_idle_id != 0) + { + g_source_remove (icon_view->priv->layout_idle_id); + icon_view->priv->layout_idle_id = 0; + } + if (icon_view->priv->model == NULL) return; @@ -2508,32 +2514,38 @@ gtk_icon_view_layout (GtkIconView *icon_view) while (icons != NULL); if (maximum_width != icon_view->priv->width) - { - icon_view->priv->width = maximum_width; - } + icon_view->priv->width = maximum_width; + y += icon_view->priv->margin; if (y != icon_view->priv->height) - { - icon_view->priv->height = y; - } + icon_view->priv->height = y; - gtk_icon_view_set_adjustment_upper (icon_view->priv->hadjustment, icon_view->priv->width); - gtk_icon_view_set_adjustment_upper (icon_view->priv->vadjustment, icon_view->priv->height); + gtk_icon_view_set_adjustment_upper (icon_view->priv->hadjustment, + icon_view->priv->width); + gtk_icon_view_set_adjustment_upper (icon_view->priv->vadjustment, + icon_view->priv->height); if (GTK_WIDGET_REALIZED (icon_view)) - { - gdk_window_resize (icon_view->priv->bin_window, - MAX (icon_view->priv->width, widget->allocation.width), - MAX (icon_view->priv->height, widget->allocation.height)); - } + gdk_window_resize (icon_view->priv->bin_window, + MAX (icon_view->priv->width, widget->allocation.width), + MAX (icon_view->priv->height, widget->allocation.height)); - if (icon_view->priv->layout_idle_id != 0) + if (icon_view->priv->scroll_to_path) { - g_source_remove (icon_view->priv->layout_idle_id); - icon_view->priv->layout_idle_id = 0; - } + GtkTreePath *path; + path = gtk_tree_row_reference_get_path (icon_view->priv->scroll_to_path); + gtk_tree_row_reference_free (icon_view->priv->scroll_to_path); + icon_view->priv->scroll_to_path = NULL; + + gtk_icon_view_scroll_to_path (icon_view, path, + icon_view->priv->scroll_to_use_align, + icon_view->priv->scroll_to_row_align, + icon_view->priv->scroll_to_col_align); + gtk_tree_path_free (path); + } + gtk_widget_queue_draw (GTK_WIDGET (icon_view)); } @@ -3271,6 +3283,8 @@ gtk_icon_view_row_inserted (GtkTreeModel *model, } verify_items (icon_view); + + gtk_icon_view_queue_layout (icon_view); } static void @@ -3313,10 +3327,10 @@ gtk_icon_view_row_deleted (GtkTreeModel *model, icon_view->priv->items = g_list_delete_link (icon_view->priv->items, list); - gtk_icon_view_queue_layout (icon_view); - verify_items (icon_view); + gtk_icon_view_queue_layout (icon_view); + if (emit) g_signal_emit (icon_view, icon_view_signals[SELECTION_CHANGED], 0); } @@ -3959,7 +3973,11 @@ gtk_icon_view_scroll_to_path (GtkIconView *icon_view, g_return_if_fail (row_align >= 0.0 && row_align <= 1.0); g_return_if_fail (col_align >= 0.0 && col_align <= 1.0); - if (! GTK_WIDGET_REALIZED (icon_view)) + if (gtk_tree_path_get_depth (path) > 0) + item = g_list_nth_data (icon_view->priv->items, + gtk_tree_path_get_indices(path)[0]); + + if (!GTK_WIDGET_REALIZED (icon_view) || !item || item->width < 0) { if (icon_view->priv->scroll_to_path) gtk_tree_row_reference_free (icon_view->priv->scroll_to_path); @@ -3976,13 +3994,6 @@ gtk_icon_view_scroll_to_path (GtkIconView *icon_view, return; } - if (gtk_tree_path_get_depth (path) > 0) - item = g_list_nth_data (icon_view->priv->items, - gtk_tree_path_get_indices(path)[0]); - - if (!item) - return; - if (use_align) { gint x, y; @@ -4031,7 +4042,7 @@ gtk_icon_view_scroll_to_item (GtkIconView *icon_view, gdk_drawable_get_size (GDK_DRAWABLE (icon_view->priv->bin_window), &width, &height); gdk_window_get_position (icon_view->priv->bin_window, &x, &y); - + if (y + item->y - focus_width < 0) gtk_adjustment_set_value (icon_view->priv->vadjustment, icon_view->priv->vadjustment->value + y + item->y - focus_width); -- 2.30.2